﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLLocalTrabalho : Inventione.Framework.BusinessLogic.BLBase
    {

        // Representa o objeto de acesso a dados
        private DALocalTrabalho da = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLLocalTrabalho()
            : base("DEFAULT")
        {
            da = new DALocalTrabalho("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLLocalTrabalho(string tenantId)
            :base(tenantId)
        {
            da = new DALocalTrabalho(tenantId);
        }

        /// <summary>
        /// Consulta lociais contrato (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="dsLocal">Descrição do local</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de locais de trabalho</returns>
        public List<LOCAL_TRABALHO> consultarLocalTrabalho(string dsLocal, string inAtivo, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<LOCAL_TRABALHO> retorno = null;

            try
            {
                retorno = this.da.consultarLocalTrabalho(dsLocal, inAtivo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta lociais contrato (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="dsLocal">Descrição do local</param>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarLocalTrabalhoCount(string dsLocal, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = da.consultarLocalTrabalhoCount(dsLocal, inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um local de trabalho
        /// </summary>
        /// <param name="cdLocal">código do local</param>
        /// <returns>Entidade local de trabalho</returns>
        public LOCAL_TRABALHO obterLocalTrabalho(int cdLocal)
        {
            LOCAL_TRABALHO retorno = null;

            try
            {
                retorno = da.obterLocalTrabalho(cdLocal);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um local de trabalho
        /// </summary>
        /// <param name="cdLocal">código do local</param>
        /// <returns>Lista contendo um local de trabalho</returns>
        public List<LOCAL_TRABALHO> listarLocalTrabalho(int cdLocal)
        {
            List<LOCAL_TRABALHO> retorno = null;

            try
            {
                retorno = this.da.listarLocalTrabalho(cdLocal);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta os locais de trabalho de uma empresa contratante
        /// </summary>
        /// <param name="cdEmpresaContratante">código da empresa</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de locias de trabalho</returns>
        public List<LOCAL_TRABALHO> consultarLocalTrabalhoPorEmpresa(int cdEmpresaContratante, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<LOCAL_TRABALHO> retorno = null;

            try
            {
                retorno = this.da.consultarLocaisTrabalhoPorEmpresa(cdEmpresaContratante, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta os locais de trabalho de uma empresa contratante
        /// </summary>
        /// <param name="cdEmpresaContratante">código da empresa</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarLocalTrabalhoPorEmpresaCount(int cdEmpresaContratante)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.consultarLocaisTrabalhoPorEmpresaCount(cdEmpresaContratante);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos para Combos

        /// <summary>
        /// Lista os locais de trabalho ativos por empresa
        /// </summary>
        /// <param name="cdEmpresaContratante">Código da empresa</param>
        /// <returns>Lista de locais de trabalho</returns>
        public List<TOCombo> listarLocaisTrabalhoAtivosPorEmpresa(int cdEmpresaContratante)
        {
            List<TOCombo> retorno = null;

            try
            {
                retorno = this.da.listarLocaisTrabalhoAtivosPorEmpresa(cdEmpresaContratante);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #endregion

        #region Métodas básicos - CRUD

        /// <summary>
        /// Insere um local de trabalho
        /// </summary>
        /// <param name="entity">Entidade local trabalho</param>
        /// <returns>Código do local de trabalho</returns>
        public int inserirLocalTrabalho(LOCAL_TRABALHO entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.da.inserirLocalTrabalho(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um local de trabalho
        /// </summary>
        /// <param name="entity">Entidade local trabalho</param>
        public void atualizarLocalTrabalho(LOCAL_TRABALHO entity)
        {
            try
            {
                this.da.atualizarLocalTrabalho(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Excluir um local de trabalho
        /// </summary>
        /// <param name="entity">Entidade local trabalho</param>
        public void excluirLocalTrabalho(LOCAL_TRABALHO entity)
        {
            try
            {
                this.da.excluirLocalTrabalho(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion
    }
}
